//
// Created by denglibin on 2019/6/17 0017.
//

/**
 *可将std::bind函数看作一个通用的函数适配器，它接受一个可调用对象，生成一个新的可调用对象来“适应”原对象的参数列表。
 * std::bind将可调用对象与其参数一起进行绑定，绑定后的结果可以使用std::function保存。std::bind主要有以下两个作用：
 *  将可调用对象和其参数绑定成一个仿函数
 *  只绑定部分参数，减少可调用对象传入的参数
 * */

#include <functional>
#include <iostream>
using namespace std;

double  my_divide(double x, double y){
    return x / y;
}

class Foo{
public:
    int sum(int i1, int i2){
        return i1 + i2;
    }
};

int main62(){
    //std::bind绑定普通函数
    auto fn_half = std::bind(my_divide,std::placeholders::_1,2.0);
    cout << fn_half(10) << endl; // 10/2 = 5

   //std::bind绑定一个成员函数
    Foo foo;
    auto f = std::bind(&Foo::sum, &foo, 95, std::placeholders::_1);
    //bind绑定类成员函数时，第一个参数表示对象的成员函数的指针，第二个参数表示对象的地址。
    //必须显示的指定&Foo::print_sum，因为编译器不会将对象的成员函数隐式转换成函数指针，所以必须在Foo::print_sum前添加&；
    //使用对象成员函数的指针时，必须要知道该指针属于哪个对象，因此第二个参数为对象的地址 &foo；
    cout << f(5) << endl; //100
    return 0;
}